# -*- coding: utf-8 -*-
"""
项目名称：NoSql_kafka_project
文件名称：create_hbase_table.py
创建时间：2025-06-05 16:19:47

系统用户：Administrator
作　　者：無以菱
联系邮箱：huangjing2001.guet@qq.com
功能描述：
- 功能：创建HBase表用于存储订单数据
- 表名：real_time_orders_table
- 列族：cf（带有版本控制和缓存优化）
"""
import happybase
import logging
import sys

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)


def connect_hbase(host="192.168.10.10", port=9090, table_prefix=None, timeout=5000):
    try:
        logger.info(f"正在连接HBase服务器 {host}:{port}")
        connection = happybase.Connection(
            host=host,
            port=port,
            table_prefix=table_prefix,
            timeout=timeout
        )
        # 测试连接
        connection.tables()
        logger.info("HBase连接成功")
        return connection
    except Exception as e:
        logger.error(f"HBase连接失败: {e}")
        return None


def create_orders_table(connection, table_name="real_time_orders_table"):
    if connection is None:
        logger.error("无法创建表：HBase连接不可用")
        return False

    try:
        # 检查表是否存在
        existing_tables = connection.tables()
        table_exists = table_name.encode('utf-8') in existing_tables

        if table_exists:
            logger.info(f"表 {table_name} 已存在，无需创建")
            return True

        # 创建表，设置列族
        families = {
            "cf": dict(max_versions=3, block_cache_enabled=True)
        }

        connection.create_table(table_name, families)
        logger.info(f"表 {table_name} 创建成功")

        # 验证表是否创建成功
        if table_name.encode('utf-8') in connection.tables():
            logger.info(f"表 {table_name} 验证成功")
            return True
        else:
            logger.error(f"表 {table_name} 创建后无法验证")
            return False

    except Exception as e:
        logger.error(f"创建表 {table_name} 时出错: {e}")
        return False


def main():
    try:
        # 连接HBase
        connection = connect_hbase()
        if not connection:
            logger.error("无法连接到HBase，程序退出")
            sys.exit(1)

        # 创建表
        if create_orders_table(connection):
            logger.info("HBase表准备就绪")
        else:
            logger.error("HBase表创建失败")
            sys.exit(1)

    except KeyboardInterrupt:
        logger.info("程序被用户中断")
    except Exception as e:
        logger.error(f"程序执行过程中出错: {e}")
        sys.exit(1)
    finally:
        # 关闭连接
        if 'connection' in locals() and connection:
            connection.close()
            logger.info("HBase连接已关闭")

if __name__ == "__main__":
    # 单独运行此文件时执行
    logger.info("正在创建HBase表...")
    main()